// This file is part of Core WF which is licensed under the MIT license.
// See LICENSE file in the project root for full license information.

using System.Windows.Markup;

namespace System.Activities.Statements;

/// <summary>
/// This class represents a Transition of a State.
/// </summary>
public sealed class Transition
{
    /// <summary>
    /// Gets or sets the Action activity which should be executed when the Transtion is taken.
    /// It's optional.
    /// </summary>
    [DependsOn("To")]
    [DefaultValue(null)]
    public Activity Action { get; set; }

    /// <summary>
    /// Gets or sets the Condition to decide whether the Transition should be taken after the Trigger activity is completed.
    /// It's optional. 
    /// If the Condition is null, the Transition would always be taken when the Trigger activity is completed.
    /// </summary>
    [DependsOn("Action")]
    [DefaultValue(null)]
    public Activity<bool> Condition { get; set; }

    /// <summary>
    /// Gets or sets DisplayName of the Transition
    /// </summary>
    public string DisplayName { get; set; }

    /// <summary>
    /// Gets or sets the target State of the Transition.
    /// It's required.
    /// </summary>
    [DependsOn("Trigger")]
    [DefaultValue(null)]
    public State To { get; set; }

    /// <summary>
    /// Gets or sets the Trigger activity of the Transition.
    /// When the Trigger activity is completed, the StateMachine will start to evaluate whether the Transition should be taken.
    /// It's required.
    /// </summary>
    [DefaultValue(null)]
    public Activity Trigger { get; set; }

    /// <summary>
    /// Gets the actual Trigger activity object that should be used when scheduling Transition trigger
    /// between states.
    /// Returns the Trigger object if if it is defined by the user; otherwise, return the null trigger.
    /// </summary>
    internal Activity ActiveTrigger => this.Trigger ?? this.Source.NullTrigger;

    /// <summary>
    /// Gets or sets Transition Id, which is unique within a State inside a StateMachine.
    /// </summary>
    internal string Id { get; set; }

    /// <summary>
    /// Gets or sets Source, which represents source state of transition
    /// </summary>
    internal State Source { get; set; }
}
